// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.sns_friend;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;

import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.ToolKits;
import com.eva.android.widget.DataLoadingAsyncTask;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rbchat.utils.IntentFactory;

/**
 * 通过邮件邀请朋友下载APP（功能就是向指定邮箱发送邀请下载APP的链接等信息，此功能
 * 的存在相当于为尚未使用本APP的人提供一个知道和下载APP的渠道，等于是借助用户的力
 * 量来推广，仅此而已，没什么高深的）.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class InviteFriendActivity extends DataLoadableActivity 
{
	/** 标签组件：要邀请的好友的邮件地址 */
	private EditText editSendToMail = null;
	
	/** 按钮：提交 */
	private TextView btnSend = null;
	
	/** 要邀请的好友邮件地址：本字段仅用于保存可能的初始化时从intent中传进来的mail */
	// 本变量目前仅用于Activity被create时从Intent中取出来的聊天好友信息对象.
	// 为何不直接在 initDataFromIntent()方法中调用switchToFriends(..)呢？
	// 原因在于，该方法里需要用到ui组件，而在initDataFromIntent()方法中Activity
	// 的ui组件还没有初始化完毕，所以只能先暂存，然后再在后绪方法中使用即可
	private String sendToMailForInit = null;
	
	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void initDataFromIntent()
	{
		//解析从intent中传过来的数据
		sendToMailForInit = IntentFactory.parseInviteFriendIntent(getIntent());
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
	 */
	@Override
	protected void initViews(Bundle savedInstanceState)
	{
		// 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
		customeTitleBarResId = R.id.sns_invite_friend_form_titleBar;
		// 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
		setContentView(R.layout.sns_invite_friend_withmail_form);
		
		// 初始化各种组件
		editSendToMail = (EditText)findViewById(R.id.invite_friend_form_sendToMailEdit);
		btnSend = (TextView)findViewById(R.id.invite_friend_form_sendBtn);
		
		// 设置标题
		setTitle(R.string.sns_invite_friend_form_title);	
		//
		this.setLoadDataOnCreate(false);
		
		// 已准备好了要邀请的人的邮箱
		if(sendToMailForInit != null)
		{
			// 将Intent中传过来的要邀请的好友邮件地件初始化到ui组件上（当前此场景用于
			// 在添加好友时，对应邮件地址没有注册的情况下——就邀请它注册）
			this.editSendToMail.setText(sendToMailForInit);
		}
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
	 */
	@Override
	protected void initListeners()
	{
		btnSend.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v)
			{
				if(String.valueOf(editSendToMail.getText()).trim().length()<=0)
				{
					editSendToMail.setError($$(R.string.sns_invite_friend_form_send_mail_hint));
					return;
				}
				
				if(!ToolKits.isEmail(String.valueOf(editSendToMail.getText()).trim()))
				{
					editSendToMail.setError($$(R.string.sns_invite_friend_form_validate_mail_not_format));// FIXME 国际化
					return;
				}
				
				// 发送邀请邮件
				new SendInviteMail().execute();
			}
		});
	}
	
	//--------------------------------------------------------------------------------------------
	/**
	 * 从服务端查询数据并返回.
	 * 
	 * @param params loadData中传进来的参数，本类中该参数没有被用到
	 */
	@Override protected DataFromServer queryData(String... params)
	{
		return null;
	}
	//将已构造完成的完整的明细数据放入列表中显示出来
	@Override protected void refreshToView(Object dateToView)
	{
	}
	
	//--------------------------------------------------------------------------------------------
	/**
	 * <p>
	 * 使用异步线程实现，提升用户体验.
	 * </p>
	 */
	private class SendInviteMail extends DataLoadingAsyncTask<String, Integer, DataFromServer>
	{
		public SendInviteMail()
		{
			super(InviteFriendActivity.this, $$(R.string.general_loading));
		}

		/**
		 * 在后台执行查询指定产品编号的大仓库库存分布情况（指定产品在哪个大仓库里有多少数量）.
		 * 
		 * @param parems 外界传进来的参数
		 * @return 查询结果，将传递给onPostExecute(..)方法
		 */
		@Override
		protected DataFromServer doInBackground(String... parems) 
		{
			return HttpRestHelper.submitInviteFriendToServer(
					// 接收邀请的email地址
					String.valueOf(editSendToMail.getText()).trim()
					// 发起邀请人的昵称
					, MyApplication.getInstance(InviteFriendActivity.this).getIMClientManager().getLocalUserInfo().getNickname()
					// 发起邀请人的email（作为被邀请人加好友的凭证）
					, MyApplication.getInstance(InviteFriendActivity.this).getIMClientManager().getLocalUserInfo().getUser_mail()
					// 发起邀请人的uid（作为被邀请人加好友的凭证）
					, MyApplication.getInstance(InviteFriendActivity.this).getIMClientManager().getLocalUserInfo().getUser_uid()
					);
		}
		
		@Override
		protected void onPostExecuteImpl(Object result)
		{
			// FIXBUG: google统计到BadTokenException (@InviteFriendFormActivity$SendInviteMail:onPostExecuteImpl:178) {main}
			//         错误，此if语句是为了保证延迟线程里不会因Activity已被关闭而此处却要非法地执行show的情况（此判断可趁为安全的show方法哦！）
			if (InviteFriendActivity.this != null && !InviteFriendActivity.this.isFinishing())
			{
				//* 到了本方法里即意味着与服务端的交互成功了
				new AlertDialog.Builder(InviteFriendActivity.this)
				.setTitle(R.string.general_tip)  
				.setMessage(R.string.sns_invite_friend_form_send_invite_success_message)
				.setNegativeButton(R.string.general_ok, null)  
				.show(); 
			}
		}
	}
}
